﻿<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:local="clr-namespace:AC.AvalonControlsLibrary.Controls"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

	<!--Converters section-->
    <local:CellSizeConverter x:Key="CellSizeConverter"/>
    <local:MonthConverter x:Key="MonthConverter"/>
	<local:HandLengthConverter x:Key="HourHandConverter" PercentageToSubtract="50"/>
    <local:HandLengthConverter x:Key="MinuteHandConverter" PercentageToSubtract="10"/>
    <local:AngleConverter x:Key="HourConverter" Units="12"/>
    <local:AngleConverter x:Key="MinuteConverter" Units="60"/>
    <local:AlignClockHands x:Key="AlignConverter"/>
    
    <!-- Brushes -->
    <SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" />
    <SolidColorBrush x:Key="DisabledBackgroundBrush" Color="#EEE" />
    <SolidColorBrush x:Key="WindowBackgroundBrush" Color="#FFF" />
    <SolidColorBrush x:Key="SelectedBackgroundBrush" Color="#DDD" />
    <SolidColorBrush x:Key="SolidBlack" Color="Black"/>
    <SolidColorBrush x:Key="SolidSilver" Color="Silver"/>
    <LinearGradientBrush x:Key="NormalBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#FFF" Offset="0.0"/>
                <GradientStop Color="#CCC" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <LinearGradientBrush x:Key="HorizontalNormalBrush" StartPoint="0,0" EndPoint="1,0">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#FFF" Offset="0.0"/>
                <GradientStop Color="#CCC" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <LinearGradientBrush x:Key="LightBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#FFF" Offset="0.0"/>
                <GradientStop Color="#EEE" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <LinearGradientBrush x:Key="HorizontalLightBrush" StartPoint="0,0" EndPoint="1,0">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#FFF" Offset="0.0"/>
                <GradientStop Color="#EEE" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <LinearGradientBrush x:Key="DarkBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#FFF" Offset="0.0"/>
                <GradientStop Color="#AAA" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <LinearGradientBrush x:Key="PressedBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#BBB" Offset="0.0"/>
                <GradientStop Color="#EEE" Offset="0.1"/>
                <GradientStop Color="#EEE" Offset="0.9"/>
                <GradientStop Color="#FFF" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>
    
    <LinearGradientBrush x:Key="NormalBorderBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#CCC" Offset="0.0"/>
                <GradientStop Color="#444" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <LinearGradientBrush x:Key="HorizontalNormalBorderBrush" StartPoint="0,0" EndPoint="1,0">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#CCC" Offset="0.0"/>
                <GradientStop Color="#444" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <LinearGradientBrush x:Key="DefaultedBorderBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#777" Offset="0.0"/>
                <GradientStop Color="#000" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <LinearGradientBrush x:Key="PressedBorderBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#444" Offset="0.0"/>
                <GradientStop Color="#888" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <SolidColorBrush x:Key="DisabledBorderBrush" Color="#AAA" />

    <SolidColorBrush x:Key="SolidBorderBrush" Color="#888" />

    <SolidColorBrush x:Key="LightBorderBrush" Color="#AAA" />
    
    <!-- Miscellaneous Brushes -->
    <SolidColorBrush x:Key="GlyphBrush" Color="#444" />

    <SolidColorBrush x:Key="LightColorBrush" Color="#DDD" />

    

	<ControlTemplate x:Key="BackButtonTemplate" TargetType="Button">
		<Path Fill="{StaticResource SolidBlack}"
		  Stretch="Fill" Width="10" Height="10"
		  Data="M388.23923,200.16536 L388.2392,212.9611 380.80291,206.08704" />
	</ControlTemplate>

	<ControlTemplate x:Key="ForwardButtonTemplate" TargetType="Button">
		<Path Fill="{StaticResource SolidBlack}"
		  Stretch="Fill" Width="10" Height="10"
		  Data="M144,122 L144,201.2 187.12074,157.8875 z" />
	</ControlTemplate>
	
	<ControlTemplate x:Key="ComboBoxToggleButton" TargetType="ToggleButton">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="20" />
            </Grid.ColumnDefinitions>
            <Border
              x:Name="Border" 
              Grid.ColumnSpan="2"
              CornerRadius="2"
              Background="{StaticResource NormalBrush}"
              BorderBrush="{StaticResource NormalBorderBrush}"
              BorderThickness="1" />
            <Border 
              Grid.Column="0"
              CornerRadius="2,0,0,2" 
              Margin="1" 
              Background="{StaticResource WindowBackgroundBrush}" 
              BorderBrush="{StaticResource NormalBorderBrush}"
              BorderThickness="0,0,1,0" />
            <Path 
              x:Name="Arrow"
              Grid.Column="1"     
              Fill="{StaticResource GlyphBrush}"
              HorizontalAlignment="Center"
              VerticalAlignment="Center"
              Data="M 0 0 L 4 4 L 8 0 Z"/>
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="ToggleButton.IsMouseOver" Value="true">
                <Setter TargetName="Border" Property="Background" Value="{StaticResource DarkBrush}" />
            </Trigger>
            <Trigger Property="ToggleButton.IsChecked" Value="true">
                <Setter TargetName="Border" Property="Background" Value="{StaticResource PressedBrush}" />
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <Setter TargetName="Border" Property="Background" Value="{StaticResource DisabledBackgroundBrush}" />
                <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DisabledBorderBrush}" />
                <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                <Setter TargetName="Arrow" Property="Fill" Value="{StaticResource DisabledForegroundBrush}" />
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

    <Style x:Key="dateTimePickerDropDown" TargetType="ComboBox">
        <Setter Property="SnapsToDevicePixels" Value="true"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
        <Setter Property="MinWidth" Value="120"/>
        <Setter Property="MinHeight" Value="20"/>
        <Setter Property="ItemContainerStyle">
			<Setter.Value>
				<Style TargetType="ComboBoxItem">
					<Setter Property="Template">
						<Setter.Value>
							<ControlTemplate TargetType="ComboBoxItem">
								<ContentPresenter Content="{TemplateBinding Content}"
									ContentTemplate="{TemplateBinding ContentTemplate}"/>
							</ControlTemplate>
						</Setter.Value>
					</Setter>
				</Style>
			</Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ComboBox">
                    <Grid>
                        <ToggleButton 
                            Name="ToggleButton" 
                            Template="{StaticResource ComboBoxToggleButton}" 
                            Grid.Column="2" 
                            Focusable="false"
                            IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,
                                RelativeSource={RelativeSource TemplatedParent}}"
                            ClickMode="Press">
                        </ToggleButton>
                        <ContentPresenter
                            Name="ContentSite"
                            IsHitTestVisible="False" 
                            Content="{TemplateBinding Tag}"
                            Margin="3,3,23,3"
                            VerticalAlignment="Center"
                            HorizontalAlignment="Left" />
                        <Popup 
                            Name="Popup"
                            Placement="Bottom"
                            IsOpen="{TemplateBinding IsDropDownOpen}"
                            AllowsTransparency="True" 
                            Focusable="False"
                            PopupAnimation="Slide">
                            <Grid 
                              Name="DropDown"
                              SnapsToDevicePixels="True"                
                              MinWidth="{TemplateBinding ActualWidth}"
                              MaxHeight="{TemplateBinding MaxDropDownHeight}">
                                <Border 
									x:Name="DropDownBorder"
									Background="{StaticResource WindowBackgroundBrush}"
									BorderThickness="1"
									BorderBrush="{StaticResource SolidBorderBrush}"/>
                                <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True">
                                    <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
                                </ScrollViewer>
                            </Grid>
                        </Popup>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="HasItems" Value="false">
                            <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                        </Trigger>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                        </Trigger>
                        <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">
                            <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/>
                            <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
        </Style.Triggers>
    </Style>

	<Style x:Key="CalendarListBoxStyle" TargetType="{x:Type ListBox}">
		<Setter Property="ItemsPanel">
			<Setter.Value>
				<ItemsPanelTemplate>
					<WrapPanel Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=ActualWidth, Converter={StaticResource CellSizeConverter}, ConverterParameter=widthCellContainer }" />
				</ItemsPanelTemplate>
			</Setter.Value>
		</Setter>
        <Setter Property="ItemContainerStyle">
            <Setter.Value>
                <Style TargetType="ListBoxItem">
                    <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
                    <Setter Property="Width" Value="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Converter={StaticResource CellSizeConverter}, ConverterParameter=widthCell}"/>
                    <Setter Property="MinHeight" Value="20"/>
                </Style>
            </Setter.Value>
        </Setter>
		
	</Style>
	
	
	<!-- Control Template for the DatePicker -->
	<ControlTemplate TargetType="{x:Type local:DatePicker}" x:Key="DatePickerTemplate">
		<Grid Width="{TemplateBinding Width}" Name="containerGrid" MinHeight="170" >
			<Grid.RowDefinitions>
				<RowDefinition Height="20"/>
				<RowDefinition Height="20"/>
				<RowDefinition Height="*"/>
			</Grid.RowDefinitions>
			<Grid Grid.Row="0">
				<Grid.ColumnDefinitions>
					<ColumnDefinition Width="8"/>
					<ColumnDefinition Width="*" Name="dateColumn"/>
					<ColumnDefinition Width="8"/>
				</Grid.ColumnDefinitions>
				<Button Name="PART_MonthBack" Grid.Column="0" Template="{StaticResource BackButtonTemplate}" />
				<WrapPanel Grid.Column="1" HorizontalAlignment="Center">
					<ComboBox SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:DatePicker}}, 
						Path=CurrentlyViewedMonth, Mode=TwoWay, Converter={StaticResource MonthConverter}}"
							  ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:DatePicker}}, Path=MonthsList}"/>
					<TextBox Margin="2,0,0,0" >
						<TextBox.Text>
							<Binding Path="CurrentlyViewedYear" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" 
									 RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:DatePicker}}">
								<Binding.ValidationRules>
									<local:YearValidation />
								</Binding.ValidationRules>
							</Binding>
						</TextBox.Text>
					</TextBox>
				</WrapPanel>
				<Button Name="PART_MonthForward" Grid.Column="2" Template="{StaticResource ForwardButtonTemplate}" />
			</Grid>

			<Grid Margin="0,5,0,0" Grid.Row="1" Background="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:DateTimePicker}}, Path=CalanderHeaderBackground}">
				<Grid.ColumnDefinitions>
					<ColumnDefinition/>
					<ColumnDefinition/>
					<ColumnDefinition/>
					<ColumnDefinition/>
					<ColumnDefinition/>
					<ColumnDefinition/>
					<ColumnDefinition/>
				</Grid.ColumnDefinitions>
				<Grid.Resources>
					<Style x:Key="{x:Type TextBlock}" TargetType="TextBlock">
						<Setter Property="Foreground" 
							Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:DateTimePicker}}, Path=CalanderHeaderForeground}"/>
					</Style>
				</Grid.Resources>
				<TextBlock Text="S" Grid.Column="0"/>
				<TextBlock Text="M" Grid.Column="1"/>
				<TextBlock Text="T" Grid.Column="2"/>
				<TextBlock Text="W" Grid.Column="3"/>
				<TextBlock Text="T" Grid.Column="4"/>
				<TextBlock Text="F" Grid.Column="5"/>
				<TextBlock Text="S" Grid.Column="6"/>
			</Grid>
			<ListBox Grid.Row="2" Name="PART_Dates" Style="{StaticResource CalendarListBoxStyle}"  />
		</Grid>
	</ControlTemplate>
          
	<Style TargetType="{x:Type local:DateTimePicker}">
		<Setter Property="Template">
			<Setter.Value>
				<ControlTemplate TargetType="{x:Type local:DateTimePicker}">		                                                 
					<ComboBox Style="{StaticResource dateTimePickerDropDown}"
						Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:DateTimePicker}}, 
                                                             Path=DateTimeSelected, Mode=OneWay}">
						<Grid Background="{TemplateBinding Background}">
							<Grid.RowDefinitions>
								<RowDefinition Height="8*"/>
								<RowDefinition Height="2*"/>
							</Grid.RowDefinitions>
							<Grid.ColumnDefinitions>
								<ColumnDefinition Width="5*"/>
								<ColumnDefinition Width="5*" Name="timeColumn"/>
							</Grid.ColumnDefinitions>
							
							<local:DatePicker Template="{StaticResource DatePickerTemplate}" x:Name="PART_DatePicker"/>
							
							<DockPanel Grid.Row="1" LastChildFill="true">
								<TextBlock TextWrapping="Wrap" Text="{Binding ElementName=PART_DatePicker, Path=CurrentlySelectedDateString, Mode=OneWay}"
									Margin="5,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Center" />
							</DockPanel> 
							
							<Grid Grid.Column="1" Name="clockGrid" Margin="5">
								<Canvas>
									<Ellipse Width="{Binding ElementName=clockGrid, Path=ActualWidth}"
										Height="{Binding ElementName=clockGrid, Path=ActualHeight}"
										Stretch="Fill" Fill="{TemplateBinding ClockBackground}" Stroke="{StaticResource SolidBlack}" 
										Name="ellipse"/>
										
									<!-- Hour Hand-->
									<Rectangle StrokeThickness="2" Stroke="{TemplateBinding HourHand}"
										Canvas.Top="{Binding ElementName=clockGrid, Path=ActualHeight, Converter={StaticResource AlignConverter}}" 
										Canvas.Left="{Binding ElementName=clockGrid, Path=ActualWidth, Converter={StaticResource AlignConverter}}">
										<Rectangle.Width>
											<MultiBinding Converter="{StaticResource HourHandConverter}">
												<Binding ElementName="ellipse" Path="ActualHeight"/>
												<Binding ElementName="ellipse" Path="ActualWidth"/>
											</MultiBinding>
										</Rectangle.Width>
										<Rectangle.RenderTransform>
											<RotateTransform Angle="{Binding ElementName=PART_TimePicker, Path=SelectedHour, Converter={StaticResource HourConverter}}" 
												CenterX="1" CenterY="1"/>
										</Rectangle.RenderTransform>
									</Rectangle>
									
									<!-- Minute Hand-->
									<Rectangle StrokeThickness="2" Stroke="{TemplateBinding MinuteHand}"
										Canvas.Top="{Binding ElementName=clockGrid, Path=ActualHeight, Converter={StaticResource AlignConverter}}" 
										Canvas.Left="{Binding ElementName=clockGrid, Path=ActualWidth, Converter={StaticResource AlignConverter}}">
										<Rectangle.Width>
											<MultiBinding Converter="{StaticResource MinuteHandConverter}">
												<Binding ElementName="ellipse" Path="ActualHeight"/>
												<Binding ElementName="ellipse" Path="ActualWidth"/>
											</MultiBinding>
										</Rectangle.Width>
										<Rectangle.RenderTransform>
											<RotateTransform Angle="{Binding ElementName=PART_TimePicker, Path=SelectedMinute, Converter={StaticResource MinuteConverter}}" 
												CenterX="1" CenterY="1"/>
										</Rectangle.RenderTransform>
									</Rectangle>
									
								</Canvas>
							</Grid>
													
							<local:TimePicker x:Name="PART_TimePicker" Grid.Column="1" Grid.Row="1"/>
						</Grid>
					</ComboBox>
				</ControlTemplate>
			</Setter.Value>	
		</Setter>			
	</Style>
    
</ResourceDictionary>